package 动态规划.路径问题;

/**
 * @Date 2024/9/27 22:58
 * @description: 最小下降路径和
 * .        https://leetcode.cn/problems/minimum-falling-path-sum/description/
 * @Author LittleNight
 */
public class likou931 {

    // 练习
    // 动态规划
    public int minFallingPathSum(int[][] matrix) {
        // 1. 创建 dp 表
        // 2. 初始化
        // 3. 填表
        // 4. 返回值
        int m = matrix.length, n = matrix[0].length;
        int[][] dp = new int[m + 1][n + 2]; // 多开两列
        // 初始化
        for (int i = 0; i < m + 1; i++) dp[i][0] = dp[i][n + 1] = Integer.MAX_VALUE;
        // 填表. 最后一列已经初始化了
        for (int i = 1; i <= m ; i++) {
            for (int j = 1; j <= n ; j++) {
                dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i - 1][j + 1])) + matrix[i - 1][j - 1];
            }
        }
        // 返回值.最后一行的一个最小值
        int ret = 0x3f3f3f3f; // 可以表示最大值. 整数最大值的一半
        for (int j = 1; j <= n; j++) {
            ret = Math.min(ret, dp[m][j]);
        }
        return ret;
    }
}
